Reactã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³è² è·åæ£ã§æé«ã®ãŠã§ãããã©ãŒãã³ã¹ãå®çŸããã®ã°ããŒãã«ã¬ã€ãã§ã¯ãã³ã³ããŒãã³ãèªã¿èŸŒã¿ãåªå é äœä»ãããé«åºŠãªãã¯ããã¯ãæ¢æ±ããããããããã€ã¹ãšå°åã§åªãããŠãŒã¶ãŒäœéšãä¿èšŒããŸãã
Reactã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³è² è·åæ£ã®ãã¹ã¿ãŒïŒã³ã³ããŒãã³ãåªå 床åé ãžã®ã°ããŒãã«ã¢ãããŒã
çµ¶ããé²åãããŠã§ãéçºã®äžçã«ãããŠãè¶ é«éã§ã·ãŒã ã¬ã¹ãªãŠãŒã¶ãŒäœéšãæäŸããããšã¯æãéèŠã§ããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ãšã£ãŠããã®èª²é¡ã¯æ§ã ãªãããã¯ãŒã¯ç¶æ³ãããã€ã¹ã®èœåãå°ççãªè·é¢ã«ãã£ãŠå¢å¹ ãããŸããNext.jsã®ãããªãã¬ãŒã ã¯ãŒã¯ãçšãããµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒã¯ãåæèªã¿èŸŒã¿æéãšæ€çŽ¢ãšã³ãžã³æé©åïŒSEOïŒãæ¹åããããã®åºç€ãšãªã£ãŠããŸããããããã¯ã©ã€ã¢ã³ããµã€ãã®JavaScriptãå¶åŸ¡ãåŒãç¶ãã åŸãSSRã ãã§ã¯æé©ãªããã©ãŒãã³ã¹ãä¿èšŒã§ããŸãããããã§Reactã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³è² è·åæ£ãéèŠãªæé©åæè¡ãšããŠç»å ŽããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ããã®åŒ·åãªæŠç¥ã®è€éããæãäžããäžçäžã®éçºè ã«å®çšçãªç¥èŠãšã°ããŒãã«ãªèŠç¹ãæäŸããŸãã
ã³ã¢ã³ã³ã»ããã®çè§£ïŒãã€ãã¬ãŒã·ã§ã³ãšãã®èª²é¡
è² è·åæ£ã«é£ã³èŸŒãåã«ãReactã®æèã§ãã€ãã¬ãŒã·ã§ã³ãäœãæå³ããã®ããææ¡ããããšãäžå¯æ¬ ã§ããã¢ããªã±ãŒã·ã§ã³ããµãŒããŒã§ã¬ã³ããªã³ã°ãããïŒSSRïŒãšãéçãªHTMLãçæãããŸãããã©ãŠã¶ã§ãã®HTMLãåãåããšãReactã®ã¯ã©ã€ã¢ã³ããµã€ãJavaScriptã¯ãããããã€ãã¬ãŒããããå¿ èŠããããŸããããã¯æ¬è³ªçã«ãã€ãã³ããªã¹ããŒãã¢ã¿ããããŠéçãªã³ã³ãã³ããã€ã³ã¿ã©ã¯ãã£ãã«ããããã»ã¹ã§ãããã®ããã»ã¹ã¯èšç®ã³ã¹ããé«ããªãå¯èœæ§ããããå¹ççã«ç®¡çãããªãå ŽåããŠãŒã¶ãŒãããŒãžãšå¯Ÿè©±ãå§ãããŸã§ã«é¡èãªé å»¶ãçããããšããããŸãããã®çŸè±¡ã¯ãã°ãã°Time to Interactive (TTI)ãšåŒã°ããŸãã
ãã€ãã¬ãŒã·ã§ã³ã®åŸæ¥ã®ã¢ãããŒãã¯ãã³ã³ããŒãã³ãããªãŒå šäœãäžåºŠã«ãã€ãã¬ãŒãããããšã§ããããã¯åçŽæå¿«ã§ãããå€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠã¯åé¡ãšãªãå¯èœæ§ããããŸãã倿°ã®èšäºããµã€ãããŒãã€ã³ã¿ã©ã¯ãã£ããªãŠã£ãžã§ãããæã€ãã¥ãŒã¹ãŠã§ããµã€ããæ³åããŠã¿ãŠãã ãããReactããã¹ãŠã®èŠçŽ ãåæã«ãã€ãã¬ãŒãããããšãããšããã©ãŠã¶ãããªãã®æéå¿çããªããªããç¹ã«äœéãªæ¥ç¶ãæ§èœã®äœãããã€ã¹ã䜿çšããŠãããŠãŒã¶ãŒãèç«ãããå¯èœæ§ããããŸãã
ããã«ããã¯ïŒåæçãªãã€ãã¬ãŒã·ã§ã³ãšãã®ã°ããŒãã«ãªåœ±é¿
å®å šãªãã€ãã¬ãŒã·ã§ã³ã®åæçãªæ§è³ªã¯ãé倧ãªã°ããŒãã«ãªèª²é¡ããããããŸãïŒ
- ãããã¯ãŒã¯é å»¶ïŒ ãµãŒããŒã€ã³ãã©ããé ãå°åã®ãŠãŒã¶ãŒã¯ãJavaScriptãã³ãã«ã®ããŠã³ããŒãæéãé·ããªããŸãã巚倧ãªã¢ããªã·ãã¯ãªãã³ãã«ã¯ããããããã«æªåãããå¯èœæ§ããããŸãã
- ããã€ã¹ã®å¶éïŒ äžçäžã®å€ãã®ãŠãŒã¶ãŒã¯ãåŠçèœåãã¡ã¢ãªãéãããã¢ãã€ã«ããã€ã¹ãä»ããŠãŠã§ãã«ã¢ã¯ã»ã¹ããŸããéããã€ãã¬ãŒã·ã§ã³ããã»ã¹ã¯ããããã®ããã€ã¹ãç°¡åã«éè² è·ã«ããå¯èœæ§ããããŸãã
- 垯åå¹ ã®å¶çŽïŒ äžçã®å€ãã®å°åã§ã¯ãä¿¡é Œæ§ã®é«ãé«éã€ã³ã¿ãŒããããåœããåã§ã¯ãããŸãããããŒã¿ãã©ã³ãéãããŠãããŠãŒã¶ãŒããæ¥ç¶ãäžå®å®ãªå°åã®ãŠãŒã¶ãŒã¯ãæé©åãããŠããªã巚倧ãªJavaScriptãã€ããŒãã«ãã£ãŠæãèŠããããšã«ãªããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒ èªã¿èŸŒãŸããããã«èŠããŠããåºç¯ãªãã€ãã¬ãŒã·ã§ã³ã®ããã«å¿çããªãããŒãžã¯ãã¢ã¯ã»ã·ããªãã£ã®éå£ãšãªãã峿ã®å¯Ÿè©±æ§ãå¿ èŠãšããæ¯æŽæè¡ã«é ŒããŠãŒã¶ãŒã劚ããŸãã
ãããã®èŠå ã¯ããã€ãã¬ãŒã·ã§ã³ããã»ã¹ã管çããããã®ããã€ã³ããªãžã§ã³ããªã¢ãããŒãã®å¿ èŠæ§ã匷調ããŠããŸãã
ã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³ãšè² è·åæ£ã®å°å ¥
ã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³ã¯ãåæçãªãã€ãã¬ãŒã·ã§ã³ã®éçã«å¯ŸåŠãããã©ãã€ã ã·ããã§ããã¢ããªã±ãŒã·ã§ã³å šäœãäžåºŠã«ãã€ãã¬ãŒããã代ããã«ãäºåã«å®çŸ©ãããåªå 床ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã«åºã¥ããŠã³ã³ããŒãã³ããéžæçã«ãã€ãã¬ãŒãããããšãã§ããŸããããã¯ãUIã®æãéèŠãªéšåãã¯ããã«éãã€ã³ã¿ã©ã¯ãã£ãã«ãªããéèŠåºŠãäœãã³ã³ããŒãã³ããç»é¢å€ã®ã³ã³ããŒãã³ãã¯åŸã§ãããã¯ã°ã©ãŠã³ãã§ããŸãã¯ãªã³ããã³ãã§ãã€ãã¬ãŒãã§ããããšãæå³ããŸãã
ãã®æèã§ã®è² è·åæ£ãšã¯ãå©çšå¯èœãªãªãœãŒã¹ãšæéã«ããã£ãŠãã€ãã¬ãŒã·ã§ã³ã®èšç®äœæ¥ã忣ãããããã«æ¡çšãããæŠç¥ãæããŸãããã€ãã¬ãŒã·ã§ã³ããã»ã¹ããã©ãŠã¶ããŠãŒã¶ãŒã®ããã€ã¹ãå§åããªãããã«ããããã¹ã ãŒãºã§å¿çæ§ã®é«ãäœéšã«ã€ãªããããã«ããããšãç®çã§ããã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³ãšçµã¿åãããããšã§ãè² è·åæ£ã¯äœæããã©ãŒãã³ã¹ãæé©åããããã®åŒ·åãªããŒã«ã«ãªããŸãã
ã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³è² è·åæ£ã®ã°ããŒãã«ãªäž»ãªå©ç¹ïŒ
- Time to Interactive (TTI) ã®æ¹åïŒ éèŠãªã³ã³ããŒãã³ããããéãã€ã³ã¿ã©ã¯ãã£ãã«ãªããäœæèªã¿èŸŒã¿æéãå€§å¹ ã«ççž®ãããŸãã
- ãŠãŒã¶ãŒäœéšã®åäžïŒ ãŠãŒã¶ãŒã¯ã¢ããªã±ãŒã·ã§ã³ã®ã³ã¢æ©èœãšããæ©ã察話ãå§ããããšãã§ãããšã³ã²ãŒãžã¡ã³ããšæºè¶³åºŠã®åäžã«ã€ãªãããŸãã
- ãªãœãŒã¹æ¶è²»ã®åæžïŒ ãŠãŒã¶ãŒããã€ã¹ãžã®è² æ ãå°ãªããªããç¹ã«ã¢ãã€ã«ãŠãŒã¶ãŒã«ãšã£ãŠæçã§ãã
- 壿ªãªãããã¯ãŒã¯ã§ã®ããã©ãŒãã³ã¹åäžïŒ äžå¯æ¬ ãªã³ã³ãã³ããåªå ããããšã§ãäœéæ¥ç¶ã®ãŠãŒã¶ãŒã§ãã¢ããªã±ãŒã·ã§ã³ãšãšã³ã²ãŒãžã§ããããã«ãªããŸãã
- ã°ããŒãã«ãªãŒãã«æé©åïŒ ã°ããŒãã«ãªãŠãŒã¶ãŒããŒã¹ãçŽé¢ãã倿§ãªãããã¯ãŒã¯ãšããã€ã¹ã®ç¶æ³ã«å¯Ÿå¿ããŸãã
ã³ã³ããŒãã³ãåªå 床åé ãå®è£ ããããã®æŠç¥
ã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³ã®æå¹æ§ã¯ãã³ã³ããŒãã³ãã®åªå åºŠãæ£ç¢ºã«å®çŸ©ããåé ããããšã«ããã£ãŠããŸããããã«ã¯ãã©ã®ã³ã³ããŒãã³ããåæã®ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã«ãšã£ãŠæãéèŠã§ããããçè§£ããä»ã®ã³ã³ããŒãã³ãã®ãã€ãã¬ãŒã·ã§ã³ãã©ã®ããã«ç®¡çããããææ¡ããããšãå«ãŸããŸãã
1. å¯èŠæ§ãšéèŠæ§ã«åºã¥ãåªå é äœä»ã
ããã¯ééããªãæãçŽæçã§å¹æçãªæŠç¥ã§ãããŠãŒã¶ãŒã«ããã«è¡šç€ºããïŒãã¡ãŒã¹ããã¥ãŒïŒãã³ã¢æ©èœã«äžå¯æ¬ ãªã³ã³ããŒãã³ãã¯ãæãé«ããã€ãã¬ãŒã·ã§ã³åªå 床ãåãåãã¹ãã§ãã
- ãã¡ãŒã¹ããã¥ãŒã®ã³ã³ããŒãã³ãïŒ ããã²ãŒã·ã§ã³ããŒãæ€çŽ¢å ¥åãäž»èŠãªã³ãŒã«ãã¥ã¢ã¯ã·ã§ã³ãã¿ã³ãã¡ã€ã³ã³ã³ãã³ãã®ããŒããŒã»ã¯ã·ã§ã³ãªã©ã®èŠçŽ ã¯ãæåã«ãã€ãã¬ãŒããããã¹ãã§ãã
- ã³ã¢æ©èœïŒ ã¢ããªã±ãŒã·ã§ã³ã«éèŠãªæ©èœïŒäŸïŒäºçŽãã©ãŒã ããããªãã¬ãŒã€ãŒïŒãããå Žåããã®ã³ã³ããŒãã³ããåªå ãããããã«ããŸãã
- ç»é¢å€ã®ã³ã³ããŒãã³ãïŒ ããã«è¡šç€ºãããªãã³ã³ããŒãã³ãïŒã¹ã¯ããŒã«ããªããšèŠããªãéšåïŒã¯åŸåãã«ã§ããŸãããããã¯ããŠãŒã¶ãŒãäžã«ã¹ã¯ããŒã«ãããšãããæç€ºçã«æäœããããšãã«é å»¶ããŠãã€ãã¬ãŒãã§ããŸãã
ã°ããŒãã«ãªäŸïŒ eã³ããŒã¹ãã©ãããã©ãŒã ãèããŠã¿ãŸããããååãªã¹ããã«ãŒãã«è¿œå ãã¿ã³ããã§ãã¯ã¢ãŠããã¿ã³ã¯éèŠãã€å¯èŠã§ãããæè¿èŠãååãã®ã«ã«ãŒã»ã«ã¯ã䟿å©ã§ã¯ãããŸãããæåã®è³Œå ¥æ±ºå®ã«ã¯ããã»ã©éèŠã§ã¯ãªããããåŸåãã«ããããšãã§ããŸãã
2. ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³é§åã®ãã€ãã¬ãŒã·ã§ã³
ããäžã€ã®åŒ·åãªãã¯ããã¯ã¯ããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã«åºã¥ããŠãã€ãã¬ãŒã·ã§ã³ãããªã¬ãŒããããšã§ããããã¯ããŠãŒã¶ãŒãæç€ºçã«ã³ã³ããŒãã³ããšå¯Ÿè©±ãããšãã«ã®ã¿ãã€ãã¬ãŒããããããšãæå³ããŸãã
- ã¯ãªãã¯ã€ãã³ãïŒ ã³ã³ããŒãã³ãã¯ããŠãŒã¶ãŒãã¯ãªãã¯ãããŸã§äžæŽ»æ§ãªãŸãŸã§ããå¯èœæ§ããããŸããäŸãã°ãã¢ã³ãŒãã£ãªã³ã»ã¯ã·ã§ã³ã¯ãããããŒãã¯ãªãã¯ããããŸã§ãã®ã³ã³ãã³ãããã€ãã¬ãŒãããªããããããŸããã
- ãããŒã€ãã³ãïŒ éèŠåºŠã®äœãã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ã«ã€ããŠã¯ããããŒæã«ãã€ãã¬ãŒã·ã§ã³ãããªã¬ãŒããããšãã§ããŸãã
- ãã©ãŒã ã€ã³ã¿ã©ã¯ã·ã§ã³ïŒ ãã©ãŒã ã®å ¥åãã£ãŒã«ãã¯ãé¢é£ããããªããŒã·ã§ã³ããžãã¯ããªã¢ã«ã¿ã€ã ã®ææ¡ã®ãã€ãã¬ãŒã·ã§ã³ãããªã¬ãŒããããšãã§ããŸãã
ã°ããŒãã«ãªäŸïŒ è€éãªããã·ã¥ããŒãã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã«ã¯å¿ èŠãªã詳现ãªãã£ãŒããããŒã¿ããŒãã«ã¯ããŠãŒã¶ãŒãã¯ãªãã¯ããŠå±éããããç¹å®ã®ããŒã¿ãã€ã³ãã«ãããŒãããšãã«ã®ã¿ãã€ãã¬ãŒããããããã«èšèšã§ããŸãã
3. ãã£ã³ã¯åãšåçã€ã³ããŒã
å³å¯ã«ã¯ã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³æŠç¥ã§ã¯ãããŸããããã³ãŒãåå²ãšåçã€ã³ããŒãã¯ãããå¯èœã«ããããã®åºç€ã§ããJavaScriptãããå°ãã管çãããããã£ã³ã¯ã«åå²ããããšã§ããã€ãã¬ãŒãããå¿ èŠãããã³ã³ããŒãã³ãã«å¿ èŠãªã³ãŒãã®ã¿ãããŒãã§ããŸãã
- åçã€ã³ããŒãïŒ`React.lazy`ãš`Suspense`ïŒïŒ Reactã«çµã¿èŸŒãŸããŠãã`React.lazy`ãš`Suspense`ã³ã³ããŒãã³ãã䜿çšãããšãåçã€ã³ããŒããã³ã³ããŒãã³ããšããŠã¬ã³ããªã³ã°ã§ããŸããããã¯ãã³ã³ããŒãã³ãã®ã³ãŒããå®éã«ã¬ã³ããªã³ã°ããããšãã«ã®ã¿ããŒããããããšãæå³ããŸãã
- ãã¬ãŒã ã¯ãŒã¯ã®ãµããŒãïŒäŸïŒNext.jsïŒïŒ Next.jsã®ãããªãã¬ãŒã ã¯ãŒã¯ã¯ãããŒãžã®ã«ãŒããã³ã³ããŒãã³ãã®äœ¿çšç¶æ³ã«åºã¥ããŠãåçã€ã³ããŒããšèªåã³ãŒãåå²ãçµã¿èŸŒã¿ã§ãµããŒãããŠããŸãã
ãããã®ãã¯ããã¯ã«ãããéèŠã§ãªãã³ã³ããŒãã³ãã®JavaScriptãã€ããŒãã¯ãå®éã«å¿ èŠã«ãªããŸã§ããŠã³ããŒããããŒã¹ãããããåæã®èªã¿èŸŒã¿ãšãã€ãã¬ãŒã·ã§ã³ã®è² æ ãå€§å¹ ã«åæžã§ããŸãã
4. ã©ã€ãã©ãªãšã«ã¹ã¿ã ããžãã¯ã«ããåªå é äœä»ã
ãã詳现ãªå¶åŸ¡ãè¡ãããã«ããµãŒãããŒãã£ã®ã©ã€ãã©ãªã掻çšãããããã€ãã¬ãŒã·ã§ã³ãã¥ãŒã管çããããã®ã«ã¹ã¿ã ããžãã¯ãå®è£ ãããããããšãã§ããŸãã
- ã«ã¹ã¿ã ãã€ãã¬ãŒã·ã§ã³ã¹ã±ãžã¥ãŒã©ïŒ ã³ã³ããŒãã³ãããã€ãã¬ãŒã·ã§ã³ã®ããã«ãã¥ãŒã«å ¥ããåªå 床ãå²ãåœãŠããããã§åŠçããã·ã¹ãã ãæ§ç¯ã§ããŸããããã«ãããã³ã³ããŒãã³ãããã€ãã©ã®ããã«ãã€ãã¬ãŒããããããé«åºŠã«å¶åŸ¡ã§ããŸãã
- Intersection Observer APIïŒ ãã®ãã©ãŠã¶APIã䜿çšããŠãã³ã³ããŒãã³ãããã¥ãŒããŒãã«å ¥ã£ãããšãæ€åºã§ããŸãããã®åŸã衚瀺ãããã³ã³ããŒãã³ãã®ãã€ãã¬ãŒã·ã§ã³ãããªã¬ãŒã§ããŸãã
ã°ããŒãã«ãªäŸïŒ å€ãã®ã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ãæã€å€èšèªãŠã§ããµã€ãã§ã¯ãã«ã¹ã¿ã ã¹ã±ãžã¥ãŒã©ãã³ã¢UIèŠçŽ ã®ãã€ãã¬ãŒããåªå ãããã®åŸããŠãŒã¶ãŒã¹ã¯ããŒã«ãäœæçãªéèŠæ§ã«åºã¥ããŠèšèªåºæã®ã³ã³ããŒãã³ããã€ã³ã¿ã©ã¯ãã£ããªãŠã£ãžã§ãããéåæã«ãã€ãã¬ãŒãããããšãã§ããŸãã
ã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³ã®å®è·µïŒNext.jsã«çŠç¹ãåœãŠãŠïŒ
人æ°ã®Reactãã¬ãŒã ã¯ãŒã¯ã§ããNext.jsã¯ãSSRãšããã©ãŒãã³ã¹æé©åã®ããã®åªããããŒã«ãæäŸããŠãããã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³ãå®è£ ããããã®çæ³çãªãã©ãããã©ãŒã ã§ãã
`React.lazy`ãš`Suspense`ã®æŽ»çš
ããã¯ãåã ã®ã³ã³ããŒãã³ãã§åçãªãã€ãã¬ãŒã·ã§ã³ãå®çŸããæãç°¡åãªæ¹æ³ã§ãã
```jsx // components/ImportantFeature.js import React from 'react'; function ImportantFeature() { // ...ã³ã³ããŒãã³ãã®ããžã㯠return (ããã¯éèŠãªæ©èœã§ãïŒ
çŽ æ©ãã€ã³ã¿ã©ã¯ãã£ãã«ãªãå¿ èŠããããŸãã
ã°ããŒãã«ã¢ããªãžããããïŒ
{/* ããã¯é å»¶ã³ã³ããŒãã³ãã§ã¯ãªããããæåã«ãã€ãã¬ãŒããããŸããããé å»¶ã³ã³ããŒãã³ãã§ãã£ãŠããåªå ãããã§ããã */}ãã®äŸã§ã¯ã`ImportantFeature`ã¯åæã®ãµãŒããŒã¬ã³ããªã³ã°HTMLãšã¯ã©ã€ã¢ã³ããµã€ããã³ãã«ã®äžéšã«ãªããŸãã`LazyOptionalWidget`ã¯é
å»¶èªã¿èŸŒã¿ãããã³ã³ããŒãã³ãã§ãããã®JavaScriptã¯ãå¿
èŠã«ãªã£ããšãã«ã®ã¿ãã§ããããã³å®è¡ãããSuspenseã®å¢çã¯èªã¿èŸŒã¿äžã«ãã©ãŒã«ããã¯UIãæäŸããŸãã
Next.jsã«ããéèŠãªã«ãŒãã®åªå é äœä»ã
Next.jsã®ãã¡ã€ã«ããŒã¹ã®ã«ãŒãã£ã³ã°ã¯ãããŒãžããšã«ã³ãŒãåå²ãæ¬è³ªçã«åŠçããŸããéèŠãªããŒãžïŒäŸïŒããŒã ããŒãžãååããŒãžïŒã¯æåã«èªã¿èŸŒãŸããããŸãã¢ã¯ã»ã¹ãããªãããŒãžã¯åçã«èªã¿èŸŒãŸããŸãã
ããŒãžå ã§ãããã现ããå¶åŸ¡ãè¡ãã«ã¯ãåçã€ã³ããŒããæ¡ä»¶ä»ãã¬ã³ããªã³ã°ãã³ã³ããã¹ãããŒã¹ã®åªå é äœä»ããšçµã¿åãããããšãã§ããŸãã
`useHydrate`ã«ããã«ã¹ã¿ã ãã€ãã¬ãŒã·ã§ã³ããžãã¯ïŒæŠå¿µïŒ
Reactèªäœã«ã¯ãã€ãã¬ãŒã·ã§ã³ã®é åºãæç€ºçã«å¶åŸ¡ããããã®çµã¿èŸŒã¿`useHydrate`ããã¯ã¯ãããŸãããããœãªã¥ãŒã·ã§ã³ãèšèšããããšã¯å¯èœã§ããäŸãã°ãRemixã®ãããªãã¬ãŒã ã¯ãŒã¯ã¯ããã€ãã¬ãŒã·ã§ã³ã«å¯ŸããŠç°ãªãã¢ãããŒããæã£ãŠããŸããReact/Next.jsã®å Žåããã€ãã¬ãŒãããã³ã³ããŒãã³ãã®ãã¥ãŒã管çããã«ã¹ã¿ã ããã¯ãäœæããããšãèããããŸãã
```jsx // hooks/useHydrationQueue.js import { useState, useEffect, createContext, useContext } from 'react'; const HydrationQueueContext = createContext(); export function HydrationProvider({ children }) { const [hydrationQueue, setHydrationQueue] = useState([]); const [isHydrating, setIsHydrating] = useState(false); const addToQueue = (component, priority = 'medium') => { setHydrationQueue(prev => [...prev, { component, priority }]); }; useEffect(() => { if (hydrationQueue.length > 0 && !isHydrating) { setIsHydrating(true); // åªå 床ã«åºã¥ããŠãã¥ãŒãåŠçããããžãã¯ãå®è£ // äŸïŒé«åªå 床ãæåã«åŠçããæ¬¡ã«äžãäœ // ããã¯åçŽåãããäŸã§ããå®éã®è£ ã¯ããè€éã«ãªããŸã const nextInQueue = hydrationQueue.shift(); // å®éã«ã³ã³ããŒãã³ãããã€ãã¬ãŒãããããžãã¯ïŒãã®éšåã¯è€éã§ãïŒ console.log('Hydrating component:', nextInQueue.component); setHydrationQueue(hydrationQueue); setIsHydrating(false); } }, [hydrationQueue, isHydrating]); return (泚æïŒå ç¢ãªã«ã¹ã¿ã ãã€ãã¬ãŒã·ã§ã³ã¹ã±ãžã¥ãŒã©ãå®è£ ããã«ã¯ãReactã®å éšã¬ã³ããªã³ã°ãšãªã³ã³ã·ãªãšãŒã·ã§ã³ããã»ã¹ã«é¢ããæ·±ãçè§£ãå¿ èŠã§ãããã¿ã¹ã¯ã¹ã±ãžã¥ãŒãªã³ã°ã®ããã®ãã©ãŠã¶APIïŒ`requestIdleCallback`ã`requestAnimationFrame`ãªã©ïŒãé¢äžããå¯èœæ§ããããŸããå€ãã®å Žåããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªããã®è€éãã®å€ããæœè±¡åããŠãããŸãã
ã°ããŒãã«ãªè² è·åæ£ã®ããã®é«åºŠãªèæ ®äºé
ã³ã³ããŒãã³ãã®åªå é äœä»ã以å€ã«ãã广çãªè² è·åæ£ãšåªããã°ããŒãã«ãŠãŒã¶ãŒäœéšã«è²¢ç®ããããã€ãã®èŠå ããããŸãã
1. ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒãšéçãµã€ãçæïŒSSGïŒ
ãããã¯ããã©ãŒãã³ã¹ã®åºç€ã§ãããã®èšäºã¯ã¯ã©ã€ã¢ã³ããµã€ãã®ãã€ãã¬ãŒã·ã§ã³ã«çŠç¹ãåœãŠãŠããŸããããµãŒããŒããé ä¿¡ãããåæHTMLã¯éåžžã«éèŠã§ããSSGã¯éçã³ã³ãã³ãã«æé«ã®ããã©ãŒãã³ã¹ãæäŸããSSRã¯åçã³ã³ãã³ããè¯å¥œãªåæèªã¿èŸŒã¿æéã§æäŸããŸãã
ã°ããŒãã«ãªåœ±é¿ïŒ ã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯ïŒCDNïŒã¯ãäºåã«ã¬ã³ããªã³ã°ãããHTMLãäžçäžã®ãŠãŒã¶ãŒã«è¿ éã«æäŸãããã€ãã¬ãŒã·ã§ã³ãå§ãŸãåã®é å»¶ãæå°éã«æããããã«äžå¯æ¬ ã§ãã
2. ã€ã³ããªãžã§ã³ããªã³ãŒãåå²
ããŒãžã¬ãã«ã®åå²ãè¶ ããŠããŠãŒã¶ãŒã®åœ¹å²ãããã€ã¹ã®èœåãããã«ã¯æ€åºããããããã¯ãŒã¯é床ã«åºã¥ããŠã³ãŒããåå²ããããšãæ€èšããŠãã ãããäœéãããã¯ãŒã¯ã®ãŠãŒã¶ãŒã¯ãæåã¯ã³ã³ããŒãã³ãã®ç°¡çŽ åãããããŒãžã§ã³ããå©çãåŸããããããŸããã
3. ããã°ã¬ãã·ããã€ãã¬ãŒã·ã§ã³ã©ã€ãã©ãª
ããã°ã¬ãã·ããã€ãã¬ãŒã·ã§ã³ãç°¡çŽ åããããšãç®çãšããã©ã€ãã©ãªãããã€ããããŸããreact-fullstackã®ãããªããŒã«ãä»ã®å®éšçãªãœãªã¥ãŒã·ã§ã³ã¯ãé å»¶ãã€ãã¬ãŒã·ã§ã³ã®ããã«ã³ã³ããŒãã³ãã宣èšçã«ããŒã¯ããæ¹æ³ãæäŸããããšããããããŸãããããã®ã©ã€ãã©ãªã¯éåžžãæ¬¡ã®ãããªãã¯ããã¯ã䜿çšããŸãïŒ
- ãã¥ãŒããŒãããŒã¹ã®ãã€ãã¬ãŒã·ã§ã³ïŒã³ã³ããŒãã³ãããã¥ãŒããŒãã«å ¥ã£ããšãã«ãã€ãã¬ãŒãããŸãã
- ã¢ã€ãã«ã¿ã€ã ãã€ãã¬ãŒã·ã§ã³ïŒãã©ãŠã¶ãã¢ã€ãã«ç¶æ ã®ãšãã«ãéèŠåºŠã®äœãã³ã³ããŒãã³ãããã€ãã¬ãŒãããŸãã
- æåã«ããåªå é äœä»ãïŒéçºè ãã³ã³ããŒãã³ãã«æç€ºçãªåªå 床ã¬ãã«ãå²ãåœãŠãããšãã§ããŸãã
ã°ããŒãã«ãªäŸïŒãã¥ãŒã¹éçŽãµã€ãã¯ãããã°ã¬ãã·ããã€ãã¬ãŒã·ã§ã³ã©ã€ãã©ãªã䜿çšããŠãã¡ã€ã³ã®èšäºããã¹ããããã«ã€ã³ã¿ã©ã¯ãã£ãã«ãªãããã«ããåºåãé¢é£èšäºãŠã£ãžã§ãããã³ã¡ã³ãã»ã¯ã·ã§ã³ã¯ãŠãŒã¶ãŒãã¹ã¯ããŒã«ããã«ã€ããŠããŸãã¯ãããã¯ãŒã¯ãªãœãŒã¹ãå©çšå¯èœã«ãªã£ããšãã«æ®µéçã«ãã€ãã¬ãŒããããããã«ããããšãã§ããŸãã
4. HTTP/2ããã³HTTP/3ãµãŒããŒããã·ã¥
ãã€ãã¬ãŒã·ã§ã³ã®é åºèªäœã«ã¯ããŸãé¢é£ããŸãããããããã¯ãŒã¯é ä¿¡ã®æé©åã¯éåžžã«éèŠã§ããHTTP/2ãŸãã¯HTTP/3ã䜿çšãããšããªãœãŒã¹ã®å€éåãšåªå é äœä»ããå¯èœã«ãªãã鿥çã«ãã€ãã¬ãŒã·ã§ã³ã«éèŠãªJavaScriptãã©ãã ãéãé ä¿¡ãããããæ¹åã§ããŸãã
5. ããã©ãŒãã³ã¹ããžã§ãããšã¢ãã¿ãªã³ã°
TTIãFirst Contentful Paint (FCP)ãLargest Contentful Paint (LCP)ãªã©ã®ã¡ããªã¯ã¹ãå«ããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ããžã§ãããèšå®ããŸãã以äžã®ããŒã«ã䜿çšããŠããããã®ã¡ããªã¯ã¹ãç¶ç¶çã«ç£èŠããŸãïŒ
- Google Lighthouse
- WebPageTest
- ãã©ãŠã¶éçºè ããŒã«ïŒããã©ãŒãã³ã¹ ã¿ãïŒ
- ãªã¢ã«ãŠãŒã¶ãŒã¢ãã¿ãªã³ã°ïŒRUMïŒããŒã«ïŒäŸïŒDatadog, SentryïŒ
ã°ããŒãã«ã¢ãã¿ãªã³ã°ïŒ 倿§ãªå°ççäœçœ®ããããã¯ãŒã¯ç¶æ³ããã®ããã©ãŒãã³ã¹ã远跡ã§ããRUMããŒã«ãæ¡çšããç¹å®ã®å°åããŠãŒã¶ãŒã»ã°ã¡ã³ãã«ç¹æã®ããã«ããã¯ãç¹å®ããŸãã
æœåšçãªèœãšã穎ãšåé¿æ¹æ³
ã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³ã¯å€§ããªå©ç¹ãæäŸããŸãããè€éãã䌎ããŸããäžæ³šæãªå®è£ ã¯æ°ããªåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
- é床ãªé å»¶ïŒ ããŸãã«ãå€ãã®ã³ã³ããŒãã³ããé å»¶ããããšãããŒãžå šäœã sluggishïŒéãïŒã§å¿çããªãããã«æããããããšããããŸãããŠãŒã¶ãŒãæºåãã§ããŠãããšæåŸ ããèŠçŽ ãé ãèªã¿èŸŒãŸããããã§ãã
- ãã€ãã¬ãŒã·ã§ã³ã®äžäžèŽãšã©ãŒïŒ ãµãŒããŒã¬ã³ããªã³ã°ãããHTMLãšãã€ãã¬ãŒã·ã§ã³åŸã®ã¯ã©ã€ã¢ã³ãã¬ã³ããªã³ã°ãããåºåãäžèŽããªãå ŽåãReactã¯ãšã©ãŒãã¹ããŒããŸããããã¯ãé å»¶ã³ã³ããŒãã³ãå ã®è€éãªæ¡ä»¶ä»ãããžãã¯ã«ãã£ãŠæªåããå¯èœæ§ããããŸãããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®éã§äžè²«ããã¬ã³ããªã³ã°ã確ä¿ããŠãã ããã
- è€éãªããžãã¯ïŒ ã«ã¹ã¿ã ãã€ãã¬ãŒã·ã§ã³ã¹ã±ãžã¥ãŒã©ã®å®è£ ã¯éåžžã«ææŠçã§ããšã©ãŒãçºçããããã§ãã絶察ã«å¿ èŠãªå Žåãé€ãããã¬ãŒã ã¯ãŒã¯ã®æ©èœãååã«æ€èšŒãããã©ã€ãã©ãªã掻çšããŠãã ããã
- ãŠãŒã¶ãŒäœéšã®äœäžïŒ ãŠãŒã¶ãŒã峿ã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãæåŸ ããŠèŠçŽ ãã¯ãªãã¯ããã®ã«ãããŒãã£ã³ã°ã¹ãããŒã衚瀺ãããããšããããŸãããŠãŒã¶ãŒã®æåŸ ã管çããããã«ã¯ãæç¢ºãªèŠèŠçåå³ãäžå¯æ¬ ã§ãã
å®çšçãªæŽå¯ïŒ ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã®ãã¹ãŠã®ã»ã°ã¡ã³ãã«ãšã£ãŠããŠãŒã¶ãŒäœéšãæ¬åœã«åäžããããšã確èªããããã«ãåžžã«ããŸããŸãªããã€ã¹ãšãããã¯ãŒã¯æ¡ä»¶ã§ã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³æŠç¥ããã¹ãããŠãã ããã
çµè«ïŒããã©ãŒãã³ã¹ã«å¯Ÿããã°ããŒãã«ãªå¿ é èŠä»¶
ã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³è² è·åæ£ã¯ãã¯ãããããªæé©åæè¡ã§ã¯ãããŸããã仿¥ã®ã°ããŒãã«åãããããžã¿ã«ç°å¢ã«ãããŠãããã©ãŒãã³ã¹ãé«ãããŠãŒã¶ãŒãã¬ã³ããªãŒãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«ã¯äžå¯æ¬ ã§ããã³ã³ããŒãã³ãã®ãã€ãã¬ãŒã·ã§ã³ãã€ã³ããªãžã§ã³ãã«åªå é äœä»ãããããšã§ãéçºè ã¯ãŠãŒã¶ãŒã®å Žæãããã€ã¹ããããã¯ãŒã¯å質ã«é¢ä¿ãªããéèŠãªãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãè¿ éã«è¡ãããããšãä¿èšŒã§ããŸãã
Next.jsã®ãããªãã¬ãŒã ã¯ãŒã¯ã¯åŒ·åºãªåºç€ãæäŸãã`React.lazy`ã`Suspense`ãææ ®æ·±ãã³ãŒãåå²ãªã©ã®ãã¯ããã¯ã¯ãéçºè ããããã®æŠç¥ã广çã«å®è£ ããåãäžããŸãããŠã§ãããŸããŸãèŠæ±ãå³ããã倿§åãç¶ããäžã§ãã»ã¬ã¯ãã£ããã€ãã¬ãŒã·ã§ã³ãšè² è·åæ£ãåãå ¥ããããšã¯ãã°ããŒãã«èŠæš¡ã§æåãç®æãã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠéèŠãªå·®å¥åèŠå ãšãªãã§ããããããã¯åã«æ©èœãæäŸããã ãã§ãªãããã¹ãŠã®ãŠãŒã¶ãŒã«ãã©ãã«ããŠããäžè²«ããŠé«éã§æ¥œããäœéšãæäŸããããšã§ãã
å®çšçãªæŽå¯ïŒ ã¢ããªã±ãŒã·ã§ã³ã®ãã€ãã¬ãŒã·ã§ã³ããã»ã¹ã宿çã«ç£æ»ããŠãã ãããé å»¶ã®åè£ãšãªãã³ã³ããŒãã³ããç¹å®ããåžžã«ãšã³ããŠãŒã¶ãŒã®äœéšãæåªå ã«èããéå±€çãªåªå é äœä»ãæŠç¥ãå®è£ ããŠãã ããã
ã°ããŒãã«éçºããŒã ã®ããã®éèŠãªãã€ã³ãïŒ
- ãã¡ãŒã¹ããã¥ãŒãšã³ã¢æ©èœã®ã³ã³ããŒãã³ããåªå ããã
- åçã€ã³ããŒãã«ã¯`React.lazy`ãš`Suspense`ãæŽ»çšããã
- ãã¬ãŒã ã¯ãŒã¯ã®æ©èœïŒNext.jsã®ã³ãŒãåå²ãªã©ïŒã广çã«å©çšããã
- éèŠã§ãªãèŠçŽ ã«ã¯ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³é§åã®ãã€ãã¬ãŒã·ã§ã³ãæ€èšããã
- 倿§ãªã°ããŒãã«ãããã¯ãŒã¯æ¡ä»¶ãšããã€ã¹ã§å³å¯ã«ãã¹ãããã
- RUMã䜿çšããŠããã©ãŒãã³ã¹ã¡ããªã¯ã¹ãç£èŠããã°ããŒãã«ãªããã«ããã¯ãæããã
ãããã®é«åºŠãªæé©åæè¡ã«æè³ããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããã ãã§ãªããäžçäžã®ãªãŒãã£ãšã³ã¹ã®ããã«ããã¢ã¯ã»ã¹ãããããå æ¬çã§ãæçµçã«ããæåããããžã¿ã«è£œåãæ§ç¯ããããšã«ãªããŸãã